//
//  ViewController.m
//  runloop
//
//  Created by hfzhangzhang on 2018/4/2.
//  Copyright © 2018年 hfzhangzhang. All rights reserved.
//

#import "ViewController.h"

#import "ZZthread.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //已经帮我们添加入了RunLoop，默认模式
    [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
         NSLog(@"11-----11");
    }];
  
    NSTimer *time =[NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"-----");
    }];
    /**
     runloop 常见2个模式 默认模式和UI模式
     包含 source Observer Timer
     NSDefaultRunLoopMode 默认模式
     UITrckingRunLoopMode UI模式 优先级最高
     
     NSRunLoopCommonModes 不是模式，是占位模式相当于上面2种一起
     **/
    [[NSRunLoop currentRunLoop]addTimer:time forMode:UITrackingRunLoopMode];
}


//线程只能通过任务保住，有执行不完的任务，用@property (strong, nonatomic) NSThread *thread 只是保住了OC对象的生命 线程走了


//uikit是线程不安全的，为了安全和效率，UI只能在主线程

-(void)thread{
    NSThread *thread =[[ZZthread alloc]initWithBlock:^{
        //        while (true) {
        //            //从事件队列去处事件处理
        //        }
        NSTimer *time =[NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
            NSLog(@"-----");
            [NSThread exit];//线程退出时候，runloop没有了，主线程干掉了自线程还在的，UI不能更新了，页面卡住了
            
            
        }];
        [[NSRunLoop currentRunLoop]addTimer:time forMode:NSDefaultRunLoopMode];
        //线程的runLoop默认不循环，死循环,currentRunLoop第一次调用会创建RunLoop，实际上是懒加载主线程是在main中开启的
        [[NSRunLoop currentRunLoop] run];
        
        //常用标记作循环，变量当变量变了，runloop停下来 runUntilDate同run方法，增加超时参数limitDate，避免进入无限循环。使用在UI线程（亦即主线程）上，可以达到暂停的效果。
        while (YES) {
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.0001]];
        }

    }] ;
    [thread start];
    
    
   //线程通行是runloop干的
    //[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:NO];
    
    
    
}

-(void)run{
    
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
